/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.general.bc;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.general.adapters.EmpleadoAdapter;
import org.cip.esymons.general.be.Cargo;
import org.cip.esymons.general.be.Empleado;
import org.cip.esymons.general.be.PersonaNatural;

/**
 *
 * @author users
 */
@Stateless
public class EmpleadoFacade implements EmpleadoFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Empleado empleado) {
        em.persist(empleado);
    }

    public void edit(Empleado empleado) {
        em.merge(empleado);
    }

    public void remove(Empleado empleado) {
        em.remove(em.merge(empleado));
    }

    public Empleado find(Object id) {
        return em.find(Empleado.class, id);
    }

    public List<Empleado> findAll() {
        return em.createQuery("select object(o) from Empleado as o").getResultList();
    }

    public Empleado buscarEmpleado(Long codigo){

        try{
        return (Empleado)em.createQuery("select object(o) from Empleado as o where o.fkPerCodigopna = ?1").setParameter(1, codigo).getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public List<PersonaNatural> listarPersonaXArea(Integer area) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select p");
            sb.append(" from CargoEmpleado c inner Join c.empleado o inner Join o.personaNatural p  ");
            sb.append(" where c.cargo.fkAreCodigo.areCodigo=?1");
            
            q = em.createQuery(sb.toString());
            
            q.setParameter(1, area);
            
            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<Empleado> listarEmpleadoXArea(Integer area) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select o");
            sb.append(" from CargoEmpleado c inner Join c.empleado o");
            sb.append(" where c.cargo.fkAreCodigo.areCodigo=?1");

            q = em.createQuery(sb.toString());

            q.setParameter(1, area);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<Empleado> listarEmpleadoXCargo(String cargo) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select o");
            sb.append(" from CargoEmpleado c inner Join c.empleado o");
            sb.append(" where c.cargo.carDescripcion=?1");

            q = em.createQuery(sb.toString());

            q.setParameter(1, cargo);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<EmpleadoAdapter> listarDestinatarioDocumento(String cadena) {
        try {
            List<EmpleadoAdapter> lista = new ArrayList<EmpleadoAdapter>();
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select new org.cip.esymons.general.adapters.EmpleadoAdapter(o, c)");
            sb.append(" from CargoEmpleado ce inner Join ce.empleado o inner Join o.personaNatural p");
            sb.append(" inner Join ce.cargo c inner Join c.fkAreCodigo a");
            sb.append(" where CONCAT(CONCAT(CONCAT(CONCAT(p.perNombres, ' '), P.perapellidoPaterno), ' '), ");
            sb.append(" p.perapellidoMaterno) like ?1 or c.carDescripcion like ?1 or a.areNombre like ?1");

            q = em.createQuery(sb.toString());
            q.setParameter(1, "%" + cadena + "%");

            lista = q.getResultList();
//            for(EmpleadoAdapter emp : (List<EmpleadoAdapter>)q.getResultList()){
//                    emp.nombEmpleado();
//                    lista.add(emp);
//            }

            sb = new StringBuilder();
            sb.append(" select new org.cip.esymons.general.adapters.EmpleadoAdapter(o, o.areNombre)");
            sb.append(" from Area o where o.areNombre like ?1 ");

            q = em.createQuery(sb.toString());

            q.setParameter(1, "%" + cadena + "%");

            lista.addAll(q.getResultList());
//            for(EmpleadoAdapter emp : (List<EmpleadoAdapter>)q.getResultList()){
//                    emp.nombArea();
//                    lista.add(emp);
//            }

            
            return lista;
        } catch (Exception ex) {
            return new ArrayList<EmpleadoAdapter>();
        }
    }

    //Sirve par listar empleados desde el autocompletar.
    public List<Empleado> listarEmpleadosPorCondicion(String cadena){
        try{
            StringBuilder sb = new StringBuilder();
            sb.append("Select em From Empleado em ");
            Query q = em.createQuery(sb.toString());
            List<Empleado> lista = new ArrayList<Empleado>();
            for(Empleado emp : (List<Empleado>)q.getResultList()){
                if(emp.getPersonaNatural().getNombreCompletoPersona().indexOf(cadena.toUpperCase())>=0){
                    lista.add(emp);
                }
            }
            return lista;

        }catch(Exception ex){
            return new ArrayList<Empleado>();
        }
    }

}
